home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / gfx / show / gs503_data.lha / Ghostscript / data / pdf_draw.ps < prev    next >
Text File  |  1997-08-14  |  10KB  |  401 lines

  1. %    Copyright (C) 1994, 1995, 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % pdf_draw.ps
  16. % PDF drawing operations (graphics, text, and images).
  17.  
  18. % We don't handle the following PDF elements yet (identified by
  19. % page number in the reference manual):
  20. %    style strings (63-64), except in a few known fonts
  21. %    font descriptor resources (71-75), except for MissingWidth
  22. %    text clipping modes (104)
  23. %        What do these mean??
  24.  
  25. % We handle the following PDF 1.2 constructs:
  26. %    gs operator (but not functions)
  27.  
  28. /.setlanguagelevel where { pop 2 .setlanguagelevel } if
  29. .currentglobal true .setglobal
  30. /pdfdict where { pop } { /pdfdict 100 dict def } ifelse
  31. GS_PDF_ProcSet begin
  32. pdfdict begin
  33.  
  34. % For simplicity, we use a single interpretation dictionary for all
  35. % PDF graphics operations, even though this is too liberal.
  36. /drawopdict 100 dict def
  37.  
  38. % ================================ Graphics ================================ %
  39.  
  40. % ---------------- Graphics state management ---------------- %
  41.  
  42. drawopdict begin
  43.             % Graphics state stack
  44.   /q { q } def
  45.   /Q { Q } def
  46.             % Graphics state setting
  47.   /cm { cm } def
  48.   /i { i } def
  49.   /J { J } def
  50.   /d { d } def
  51.   /j { j } def
  52.   /w { w } def
  53.   /M { M } def
  54.   /gs { gs } def
  55. end
  56.  
  57. /gsparamdict mark
  58.   /Type { pop }
  59.   /SA { /setstrokeadjust 1 # }
  60.   /OP { /setoverprint 1 # }
  61.   /BG
  62.    { dup /Identity eq
  63.       { pop { } /setblackgeneration 1 #
  64.       }
  65.       {        %****** DUMMY ******
  66.     pop
  67.       }
  68.      ifelse
  69.    }
  70.   /UCR
  71.    { dup /Identity eq
  72.       { pop { } /setundercolorremoval 1 #
  73.       }
  74.       {        %****** DUMMY ******
  75.     pop
  76.       }
  77.      ifelse
  78.    }
  79.   /TR
  80.    { dup /Identity eq
  81.       { pop { } /settransfer 1 #
  82.       }
  83.       {        %****** DUMMY ******
  84.     pop
  85.       }
  86.      ifelse
  87.    }
  88.   /HT
  89.    { dup /Default eq
  90.       { pop /.setdefaultscreen 0 #
  91.       }
  92.       {        %****** DUMMY ******
  93.     pop
  94.       }
  95.      ifelse
  96.    }
  97.   /HTP { oget aload pop /sethalftonephase 2 # }
  98. .dicttomark readonly def
  99. /gs            % <gsres> gs -
  100.  { Page /ExtGState rget
  101.     {  { oforce exch gsparamdict exch .knownget { exec } { pop } ifelse }
  102.       forall
  103.     }
  104.    if
  105.  } bdef
  106.  
  107. % ---------------- Color setting ---------------- %
  108.  
  109. /csgray            % <op> <csop> csgray -
  110.  { /DefaultGray Page /ColorSpace rget
  111.     { 3 -1 roll exch 3 1 roll }
  112.    if pop cvx exec
  113.  } bdef
  114. /csrgb            % <op> <csop> csrgb -
  115.  { /DefaultRGB Page /ColorSpace rget
  116.     { 3 -1 roll exch 3 1 roll }
  117.    if pop cvx exec
  118.  } bdef
  119. /cscmyk            % <op> <csop> cscmyk -
  120.  { pop cvx exec
  121.  } bdef
  122. /csresolve        % <csresource> csresolve <colorspace>
  123.  { dup Page /ColorSpace rget
  124.     { exch pop resolvecolorspace }
  125.     { /undefined cvx signalerror }
  126.    ifelse dup type /nametype ne { dup length 1 eq { 0 get } if } if
  127.  } bdef
  128. /cset        % <c0> ... [- <sc1> <sc2> <sc3> <sc4> <sc5>] cset -
  129.  {        % We can't really make sc[n] and SC[N] work, because
  130.         % the color space information isn't available at
  131.         % conversion time; so we hack it by assuming that
  132.         % all the operands on the stack are used, and that
  133.         % if the top operand is a name, it's a Pattern resource.
  134.    1 index type /nametype eq
  135.     { exch Page /Pattern rget { resolvepattern } { null } ifelse exch }
  136.    if
  137.    count 1 sub get exec
  138.  } bdef
  139. /resolvepattern        % <patternstreamdict> resolvepattern <patterndict>
  140.  {        % Don't do the resolvestream now: just capture the data
  141.         % from the file if necessary.
  142.    dup length dict copy
  143.    dup /FilePosition .knownget
  144.     { 1 index /File get dup fileposition 3 1 roll
  145.         % Stack: dict savepos pos file
  146.       dup 3 -1 roll setfileposition
  147.       dup 3 index /Length get string readstring pop
  148.         % Stack: dict savepos file string
  149.       3 1 roll exch setfileposition
  150.       1 index /File 3 -1 roll put
  151.       dup /FilePosition undef
  152.     }
  153.    if
  154.    dup /PaintProc
  155.     { false resolvestream pdfopdict .pdfrun
  156.     }
  157.    put
  158.  } bdef
  159.  
  160. drawopdict begin
  161.   /g { /g { cs sc1 } csgray } bdef
  162.   /rg { /rg { cs sc3 } csrgb } bdef
  163.   /k { /k { cs sc4 } cscmyk } bdef
  164.   /cs { csresolve cs } bdef
  165.   /sc { { null sc1 sc2 sc3 sc4 sc5 } cset } bdef
  166.   /scn /sc load def
  167.   /G { /G { CS SC1 } csgray } bdef
  168.   /RG { /RG { CS SC3 } csrgb } bdef
  169.   /K { /K { CS SC4 } cscmyk } bdef
  170.   /CS { csresolve CS } bdef
  171.   /SC { { null SC1 SC2 SC3 SC4 SC5 } cset } bdef
  172.   /SCN /SC load def
  173. end
  174.  
  175. % ---------------- Paths ---------------- %
  176.  
  177. drawopdict begin
  178.             % Path construction
  179.   /m { m } def
  180.   /l { l } def
  181.   /c { c } def
  182.   /v { v } def
  183.   /y { y } def
  184.   /re { re } def
  185.   /h { h } def
  186.             % Path painting and clipping
  187.   /n { n } def
  188.   /S { S } def
  189.   /s { s } def
  190.   /f { f } def
  191.   /f* { f* } def
  192.   /B { B } def
  193.   /b { b } def
  194.   /B* { B* } def
  195.   /b* { b* } def
  196.   /W { W } def
  197.   /W* { W* } def
  198. end
  199.  
  200. % ---------------- XObjects ---------------- %
  201.  
  202. /xobjectprocs mark        % <dict> -proc- -
  203.   /Image { DoImage }
  204.   /Form { DoForm }
  205. .dicttomark readonly def
  206.  
  207. /ncompdict mark
  208.   /DeviceGray 1
  209.   /CalGray 1
  210.   /DeviceRGB 3
  211.   /CalRGB 3
  212.   /Lab 3
  213.   /DeviceCMYK 4
  214.   /CalCMYK 4
  215. .dicttomark readonly def
  216. /defaultdecodedict mark
  217.   /DeviceGray [0 1] readonly
  218.   /CalGray 1 index
  219.   /DeviceRGB [0 1 0 1 0 1] readonly
  220.   /CalRGB 1 index
  221.   /Lab
  222.    { 0 100 2 index 1 get /Range .knownget not { {-100 100 -100 100} } if
  223.      aload pop 6 array astore readonly
  224.    } bind
  225.   /DeviceCMYK [0 1 0 1 0 1 0 1] readonly
  226.   /CalCMYK 1 index
  227. .dicttomark readonly def
  228. /csrdict mark
  229.   /Indexed
  230.    { dup 3 oget dup type /stringtype eq
  231.       { pop
  232.       }
  233.       {        % The color lookup table is a stream.
  234.         % Get its contents.
  235.     true resolvestream
  236.     1 index 2 get 1 add
  237.     ncompdict 3 index 1 get
  238.       dup type /arraytype eq { 0 get } if get mul
  239.     string readstring pop
  240.     1 index 3 3 -1 roll put
  241.       }
  242.      ifelse
  243.    }
  244.   /Pattern
  245.    { dup type /nametype ne
  246.       { dup length 1 ge
  247.      { 1 get resolvecolorspace
  248.        /Pattern exch 2 array astore
  249.      }
  250.     if
  251.       }
  252.      if
  253.    }
  254. .dicttomark readonly def
  255. /resolvecolorspace    % <cspace> resolvecolorspace <cspace'>
  256.  { dup dup type /arraytype eq { 0 get } if
  257.    //csrdict exch .knownget { exec } if
  258.  } bdef
  259. /DoImage
  260.  { dup length dict
  261.    1 index /ColorSpace knownoget
  262.     { resolvecolorspace
  263.       dup type /arraytype eq { dup length 1 eq { 0 get } if } if
  264.       exch begin /ColorSpace exch def
  265.     }
  266.     { begin
  267.     }
  268.    ifelse
  269.    /ImageType 1 def
  270.         % Always define ImageMask appropriately.
  271.    dup /ImageMask knownoget dup { and } if
  272.      /ImageMask exch def
  273.    /Width 2 copy oget def
  274.    /Height 2 copy oget def
  275.    /BitsPerComponent 2 copy oget def
  276.    /Decode 2 copy knownoget not
  277.     {        % Decode is required for the PostScript image operators.
  278.       ImageMask
  279.        { [0 1]
  280.        }
  281.        { ColorSpace dup type /arraytype eq { 0 get } if dup /Indexed eq
  282.       { pop [ 0 1 BitsPerComponent bitshift 1 sub ] }
  283.       { defaultdecodedict exch get exec }
  284.      ifelse
  285.        }
  286.       ifelse
  287.     }
  288.    if def
  289.    /Interpolate 2 copy knownoget { def } { pop } ifelse
  290.    /ImageMatrix Width 0 0 Height neg 0 Height 6 array astore def
  291.         % Define DataSource as the width of the row buffer,
  292.         % which is what is needed if we're writing PostScript.
  293.    /DataSource 
  294.      Width BitsPerComponent mul
  295.      ImageMask not { Decode length 2 idiv mul } if
  296.      7 add 8 idiv
  297.    def
  298.         % Even though we're going to read data,
  299.         % pass false to resolvestream so that
  300.         % it doesn't try to use Length (which may not be present).
  301.    false resolvestream /Is_stream exch store
  302.    currentdict end ID
  303.  } bdef
  304. % Redefine Is, which constructs the data source for the image,
  305. % to retrieve the stream.  (pdf_2ps.ps redefines Is to copy the data too.)
  306. userdict /Is_stream null put
  307. /Is        % <imagedict> Is <imagedict> <datasource>
  308.  { Is_stream
  309.  } bdef
  310.  
  311. /DoForm
  312.  { dup [ /pop load 2 index
  313.     { false resolvestream pdfopdict .pdfrun }
  314.    aload pop ] cvx /PaintProc exch put
  315.    execform
  316.  } bdef
  317.  
  318. drawopdict begin
  319.   /Do
  320.     { PDFfile fileposition exch
  321.       dup Page /XObject rget not { /undefined cvx signalerror } if
  322.       exch pop dup /Subtype get xobjectprocs exch get exec
  323.       PDFfile exch setfileposition
  324.     } bdef
  325. end
  326.  
  327. % ---------------- In-line images ---------------- %
  328.  
  329. % Undo the abbreviations in an in-line image dictionary.
  330. % Note that these can appear as keys, values, or members of array values.
  331. % /I is ambiguous; we check specially for it below.
  332. /unabbrevdict mark
  333.     % Top-level dictionary keys
  334.   /BPC /BitsPerComponent  /CS /ColorSpace  /D /Decode  /DP /DecodeParms
  335.   /F /Filter  /H /Height  /IM /ImageMask  /W /Width
  336.     % Values
  337.   /AHx /ASCIIHexDecode  /A85 /ASCII85Decode  /CC /CalCMYK
  338.   /CCF /CCITTFaxDecode  /CG /CalGray  /CR /CalRGB
  339.   /DCT /DCTDecode  /CMYK /DeviceCMYK  /G /DeviceGray  /RGB /DeviceRGB
  340.   /I /Indexed  /LZW /LZWDecode  /RL /RunLengthDecode
  341. .dicttomark readonly def
  342. /unabbrev        % <obj> unabbrev <obj'>
  343.  { dup type /nametype eq
  344.     { unabbrevdict 1 index .knownget { exch pop } if
  345.     }
  346.     { dup type /arraytype eq
  347.        { dup 0 1 2 index length 1 sub
  348.       { 2 copy get unabbrev put dup
  349.       }
  350.      for pop
  351.        }
  352.       if
  353.     }
  354.    ifelse
  355.  } bdef
  356.  
  357. drawopdict begin
  358.   /BI { mark } bdef
  359.   /ID
  360.     { counttomark
  361.        { counttomark 1 roll
  362.      dup /I eq { pop /Interpolate } { unabbrev } ifelse
  363.        }
  364.       repeat
  365.       /File PDFsource
  366.       .dicttomark DoImage
  367.       PDFsource token pop /EI ne { /ID cvx /syntaxerror signalerror } if
  368.     } bdef
  369. end
  370.  
  371. % ================================ Text ================================ %
  372.  
  373. drawopdict begin
  374.             % Text control
  375.   /BT { BT } def
  376.   /ET { ET } def
  377.   /Tc { Tc } def
  378.   /TL { TL } def
  379.   /Tr { Tr } def
  380.   /Ts { Ts } def
  381.   /Tw { Tw } def
  382.   /Tz { Tz } def
  383.             % Text positioning
  384.   /Td { Td } def
  385.   /TD { TD } def
  386.   /Tm { Tm } def
  387.   /T* { T* } def
  388.             % Text painting
  389.   /Tj { Tj } def
  390.   /' { ' } def
  391.   /" { " } def
  392.   /TJ { mark exch aload pop TJ } def
  393. end
  394.  
  395. end            % pdfdict
  396. end            % GS_PDF_ProcSet
  397. .setglobal
  398.